﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AlgoritmosTA1
{
    public partial class Form1 : Form
    {
        Matriz a;

        public Form1()
        {
            InitializeComponent();

            //Inicializar vista
            int numFilas = 30;
            dataGridView1.ColumnCount = Constantes.Abecedario.Length;
            for (int i = 0; i < Constantes.Abecedario.Length; i++) { 
                dataGridView1.Columns[i].Name = Constantes.Abecedario[i] + "";
            }
            dataGridView1.RowCount = numFilas;
            for (int i = 0; i < numFilas; i++) dataGridView1.Rows[i].HeaderCell.Value = (i + 1) + " ";

            //Inicializar matriz esparcida
            a = new Matriz();
            ArbolSintaxis.m = a;
            a.crear(numFilas, Constantes.Abecedario.Length);

            //al insertar texto en la gridview llamar a metodo adicionar de la matriz
            dataGridView1.CellEndEdit += new DataGridViewCellEventHandler(dataGridView1_CellValueChanged);

            dataGridView1.CellBeginEdit += new DataGridViewCellCancelEventHandler(dataGridView1_CellBeginEdited);


            /**
             * Modo de linea de comandos
             * 
            a.adicionar(2, 1, 1); //llamamos al método adicionar y le entregamos el valor 2 en la fila 1, con columna 1
            a.adicionar(0, 1, 1);
            a.adicionar(3, 1, 2); //llamamos al método adicionar y le entregamos el valor 3 en la fila 1, con columna 2
            a.adicionar(4, 2, 2); //llamamos al método adicionar y le entregamos el valor 4 en la fila 2, con columna 2
            a.adicionar(5, 2, 3); //llamamos al método adicionar y le entregamos el valor 5 en la fila 2, con columna 3
            a.imprimir(a.m);
             **/

        }

        private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {

            Console.WriteLine("Celda " + dataGridView1.Columns[e.ColumnIndex].Name + dataGridView1.Rows[e.RowIndex].HeaderCell.Value + " actualizada a " +
                dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value);

            try
            {
                String cadena;
                if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == null) cadena = "0";
                else
                {
                    cadena = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
                    cadena = cadena.Replace(" ", string.Empty);
                }
                
                // esta cadena debe convertirse a nodos, el nodo padre o nodo de mayor nivel debe ser adicionado a la matriz
                //usando el metodo adicionar(ArbolSintaxis arbol, int f, int c)

                ArbolSintaxis nodoArbol;
                if (cadena[0].ToString().Equals(Constantes.Operacion))
                {
                    nodoArbol = ArbolSintaxis.ArmarArbol(cadena,cadena);
                }
                else
                {
                    nodoArbol = new ArbolSintaxis(Convert.ToString(cadena),cadena);
                }

                a.adicionar(nodoArbol, e.RowIndex + 1, e.ColumnIndex + 1);
                
                //para mostrar el resultado, actualizar la celda:
                dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = nodoArbol.Resolver();
                //solo se actualiza la vista, el nodo de la matriz sigue apuntando al arbol

                //ArbolSintaxis nodoBuscado1 = a.buscarCelda("A1");
                //if (nodoBuscado1 != null) Console.WriteLine("en A1: " + nodoBuscado1.Info);


            }
            catch (Exception exception)
            {
                Console.WriteLine("Insertar solo números");
            }

            

        }

        private void dataGridView1_CellBeginEdited(object sender, System.Windows.Forms.DataGridViewCellCancelEventArgs e)
        {
            //mostrar valor del arbol al que apunta la matriz
            ArbolSintaxis arbol = a.buscarCeldaPorColFil(e.RowIndex + 1, e.ColumnIndex + 1);
            if ( arbol != null)
            {
                dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = arbol.CadCompleta; 
            }

            
        }
    }
}
